# app/__init__.py
# -*- coding: utf-8 -*-
'''
@File    :   __init__.py
@Time    :   2024/11/26
@Author  :   Wang Xi
@Version :   1.0
@Desc    :   FastAPI 应用初始化
'''

from fastapi import FastAPI
from fastapi.staticfiles import StaticFiles
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker, scoped_session
from config import config

# 数据库配置
# 创建数据库引擎，使用配置文件中的数据库URI
engine = create_engine(f"sqlite:///instance/{config.VIM_SERVER_NAME}.db")

# 创建一个会话工厂，用于生成新的数据库会话
# 使用scoped_session来确保在多线程环境下会话的线程安全
sessionLocal = scoped_session(sessionmaker(autocommit=False, autoflush=False, bind=engine))

def create_app():
    # 创建FastAPI应用实例
    app = FastAPI()

    # 挂载静态文件目录
    # 将/static路径下的请求映射到app/static目录，名称为"static"
    app.mount("/static", StaticFiles(directory="app/static"), name="static")

    # 导入模型
    # 初始化 Vim 模型
    from .models.vim import vim
    vim.name = config.VIM_SERVER_NAME
    vim.cpuMax = config.VIM_RESOURCE_CPU
    vim.ramMax = config.VIM_RESOURCE_RAM
    vim.romMax = config.VIM_RESOURCE_ROM
    vim.cpuRemain = vim.cpuMax
    vim.ramRemain = vim.ramMax
    vim.romRemain = vim.romMax

    # 初始化 Vnf 模型（数据库模型）
    from .models.vnf import base
    # 创建未存在的表
    base.metadata.create_all(bind=engine)

    # 导入路由
    # 从routes.main模块导入路由器对象main_router
    from .routes.main import router as main_router
    # 将main_router包含到应用中，设置前缀和标签
    app.include_router(main_router, prefix="", tags=["main"])

    # 返回配置好的FastAPI应用实例
    return app